/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Control;

import Entidades.informes.*;
import com.itextpdf.text.DocumentException;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;

/**
 *
 * @author Gabriel
 */
public class GestorInformes {
    private Informe informe;
    private String dir;

    private String criterios[], alternativas[], matrizValores[][];
    private double matrizDiferencias[][], matrizPreferencias[][], matrizIntensidadPref[][];
    private double flujoPositivo[], flujoNegativo[], preorden[];

    private String titulo;
    private static String subTitulos[], explicaciones[]; // Uno por cada matriz

    private boolean tituloSeperado= false;
    private boolean tablasSeperado= false;

    public GestorInformes(String dir, int tipoInforme) throws DocumentException, FileNotFoundException{
        this.dir= dir;
        if(tipoInforme == Informe.INFORME_PDF)
            informe= new InformePdf(dir);
        else
            informe= new InformeExcel(dir);

        subTitulos= new String[6];
        explicaciones= new String[6];
    }

    public void generarInforme(String dirGrafo) throws IOException{
        informe.agregarTitulo(titulo);
        if(tituloSeperado) informe.nuevaPagina();

        String filas[]= new String[6 + alternativas.length];
        filas[0]= "Peso"; filas[1]= "Función"; filas[2]= "Función de Preferencia";
        filas[3]= "p"; filas[4]= "q"; filas[5]= "sigma";
        for(int i= 0; i< alternativas.length; i++)
            filas[i+6]= alternativas[i];

        if(subTitulos != null) informe.agregarSubTitulo(subTitulos[0]);
        if(explicaciones != null) informe.agregarParrafo(explicaciones[0]);
        informe.agregarTabla("Datos del Problema", criterios, filas, matrizValores, "Punto de partida del problema");
        if(tablasSeperado) informe.nuevaPagina();

        if(matrizDiferencias != null){
            filas= prepararFilasComparacion();
            if(subTitulos != null) informe.agregarSubTitulo(subTitulos[1]);
            if(explicaciones != null) informe.agregarParrafo(explicaciones[1]);
            informe.agregarTabla("Matriz de Diferencias", criterios, filas, matrizDiferencias, "Como se situan las alternativas con respecto a cada atributo");
            if(tablasSeperado) informe.nuevaPagina();
        }

        if(matrizPreferencias != null){
            filas= prepararFilasComparacion();
            if(subTitulos != null) informe.agregarSubTitulo(subTitulos[2]);
            if(explicaciones != null) informe.agregarParrafo(explicaciones[2]);
            informe.agregarTabla("Matriz de Diferencias con Función de Preferencia", criterios, filas, matrizPreferencias, "Como se situan las alternativas con respecto a cada atributo");
            if(tablasSeperado) informe.nuevaPagina();
        }

        if(matrizIntensidadPref != null){
            if(subTitulos != null) informe.agregarSubTitulo(subTitulos[3]);
            if(explicaciones != null) informe.agregarParrafo(explicaciones[3]);
            informe.agregarTabla("Intensidades de Preferencia", alternativas, alternativas, matrizIntensidadPref, "Intensidad de la preferencia de la alternativa Xi comparada con Xk");
            if(tablasSeperado) informe.nuevaPagina();
        }

        if(flujoPositivo != null){
            if(subTitulos != null) informe.agregarSubTitulo(subTitulos[4]);
            if(explicaciones != null) informe.agregarParrafo(explicaciones[4]);

            String flujoSuperacion[][]= new String[2][flujoPositivo.length];
            for(int i= 0; i< flujoSuperacion.length; i++){
                for(int j= 0; j< flujoSuperacion[0].length; j++){
                    if(i == 0) flujoSuperacion[i][j]= String.valueOf(flujoPositivo[j]);
                    if(i == 1) flujoSuperacion[i][j]= String.valueOf(flujoNegativo[j]);
                }
            }

            informe.agregarTabla("Flujos de Superacion", alternativas, new String[]{"Flujo Positivo", "Flujo Negativo"}, flujoSuperacion, "Flujos de Superación");
            if(tablasSeperado) informe.nuevaPagina();
        }

        if(subTitulos != null) informe.agregarSubTitulo(subTitulos[5]);
        if(explicaciones != null) informe.agregarParrafo(explicaciones[5]);
        //informe.agregarImagen(dirGrafo);
        
        informe.cerrarEdicionDocumento();
    }

    public void setPropiedades(String autor, String descripcion){
        ((InformePdf)informe).agregarAutor(autor);
        ((InformePdf)informe).agregarDescripcion(descripcion);
    }

    private String[] prepararFilasComparacion(){
        String filas[]= new String[(alternativas.length * alternativas.length) - alternativas.length];
        int pos= 0;
        for(int i= 0; i< alternativas.length; i++){
            for(int j= 0; j< alternativas.length; j++){
                if(i == j) continue;
                filas[pos]= alternativas[i] + " - " + alternativas[j];
                pos++;
            }
        }
        return filas;
    }

    /******************** METODOS SETTERS Y GETTERS ***************************/
    public File getInformePDF(){
        return new File(dir);
    }

    public String getPathPDF(){
        return dir;
    }

    public void setCriterios(String[] criterios) {
        this.criterios = criterios;
    }

    public void setAlternativas(String[] alternativas) {
        this.alternativas = alternativas;
    }

    public void setMatrizValores(String[][] matrizValores) {
        this.matrizValores = matrizValores;
    }

    public void setMatrizDiferencias(double[][] matrizDiferencias) {
        this.matrizDiferencias= matrizDiferencias;
    }

    public void setMatrizPreferencias(double[][] matrizPreferencias) {
        this.matrizPreferencias = matrizPreferencias;
    }

    public void setMatrizIntensidadPref(double[][] matrizIntensidadPref) {
        this.matrizIntensidadPref = matrizIntensidadPref;
    }

    public void setFlujosDeSuperacion(double[] flujoPositivo, double[] flujoNegativo) {
        this.flujoPositivo = flujoPositivo;
        this.flujoNegativo = flujoNegativo;
    }

    public void setPreorden(double[] preorden) {
        this.preorden = preorden;
    }

    public void setTitulo(String titulo) {
        this.titulo = titulo;
    }

    public void setSubTitulos(String[] subTitulos) {
        this.subTitulos = subTitulos;
    }

    public void setSubTitulo(String subtitulo, int pos){
        this.subTitulos[pos]= subtitulo;
    }

    public void setExplicaciones(String[] explicaciones) {
        this.explicaciones = explicaciones;
    }

    public void setExplicacion(String explicacion, int pos){
        this.explicaciones[pos]= explicacion;
    }

    public String[] getSubtitulos(){
        return this.subTitulos;
    }

    public String getSubtitulo(int pos){
        return this.subTitulos[pos];
    }

    public String[] getExplicaciones(){
        return this.explicaciones;
    }

    public String getExplicacion(int pos){
        return this.explicaciones[pos];
    }

    public void setTituloAparte(){
        tituloSeperado= true;
    }

    public void setTablasAparte(){
        tablasSeperado= true;
    }
}
